﻿#include "uifiltertableview.h"
#include "shlib/viewmodel/ctablemodel.h"
#include "shlib/viewmodel/uifieldsearchwidget.h"
#include "shlib/viewmodel/cfiltermodel.h"
#include "shlib/viewmodel/ctabledelegate.h"
#include "shlib/viewmodel/uisigtableview.h"

#include "shlib/viewmodel/uitoast.h"
#include "shlib/viewmodel/uiadvancesearchdialog.h"
#include "shlib/viewmodel/uisortdialog.h"
#include <QTableView>
#include <QLayout>
#include <QHeaderView>
#include <QJsonArray>
#include <QJsonDocument>
#include <QApplication>
#include <QClipboard>
#include <QPushButton>
#include <shlib/quc_sdk/iconhelper/icon_helper.h>

#include <ElaIconButton.h>

UiFilterTableView::UiFilterTableView(QWidget *parent) : QWidget(parent)
{
    IconHelper* iconsMgr = IconHelper::instance();
    m_model = new CTableModel(this);

    CTableDelegate* delegate = new CTableDelegate(this);

    m_filterModel = new CFilterModel(this);
    m_filterModel->setSourceModel(m_model);

    m_tableView = new UiSigTableView(this);
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    m_tableView->setModel(m_filterModel);
    m_tableView->setItemDelegate(delegate);
    m_tableView->setAlternatingRowColors(true);
    m_tableView->verticalHeader()->setHidden(true);

    m_searchWidget = new UiFieldSearchWidget(this);
    m_searchWidget->setMinimumHeight(30);
    m_searchWidget->setFields(QStringList() <<"信号名称"<< "描述" << "分组");
    m_searchWidget->searchBox()->setMinimumHeight(30);

    // 初始化清空搜索按钮，并连接点击事件
    m_clearSearchBtn = new QPushButton("清空搜索",this);
    m_clearSearchBtn->setMinimumHeight(30);
    m_clearSearchBtn->setStyleSheet("QPushButton { background-color: #1e3050; border: none; border-radius: 5px; color: white;}");
    m_clearSearchBtn->setIcon(QIcon(iconsMgr->getPixmap(QColor::fromString("#63E6BE"), IconHelper::FontAwesome6Solid, 0xf12d, 19, 20,20)));
    connect(m_clearSearchBtn,&QPushButton::clicked,this,[=](){
        m_filterModel->applyFilter("","");
        m_searchWidget->clearSearch();
    });

    m_addBtn = new QPushButton("添加信号",this);
    m_addBtn->setMinimumHeight(20);
    m_addBtn->setStyleSheet("QPushButton { background-color: #1e3050; border: none; border-radius: 5px; color: white;}");
    m_addBtn->setIcon(QIcon(iconsMgr->getPixmap(QColor::fromString("#63E6BE"), IconHelper::FontAwesome6Solid, 0xf5ff, 19, 20,20)));
    connect(m_addBtn,&QPushButton::clicked,this,&UiFilterTableView::slotAddSig);

    QHBoxLayout* topLayout = new QHBoxLayout;
    topLayout->addWidget(m_searchWidget);
    topLayout->addWidget(m_clearSearchBtn);
    topLayout->addStretch(0);
    topLayout->addWidget(m_addBtn);

    //响应删除信号操作
    connect(m_tableView,&UiSigTableView::sigDeleteSig,this,&UiFilterTableView::slotDeleteSig);

    //响应粘贴信号操作
    connect(m_tableView,&UiSigTableView::sigPasteSig,this,&UiFilterTableView::slotPasteSig);

    //响应添加数据
    connect(m_tableView,&UiSigTableView::sigAppendData,this,[=](QSharedPointer<IModel> data){m_model->appendData(data);});

    //更新模型个数据信号
    connect(m_model,&CTableModel::sigUpdateData,this,&UiFilterTableView::sigUpdateData);


    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(topLayout);
    mainLayout->addWidget(m_tableView);

    // 连接搜索信号，执行搜索逻辑
    connect(m_searchWidget,&UiFieldSearchWidget::sigSearch,this,[=](const QString& fieldName,const QString& searchText){
        m_filterModel->applyFilter(fieldName,searchText);
    });

    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setStyleSheet("background-color: rgba(0, 0, 0, 0);");
}

/**
 * 向表格视图中追加数据。
 * 
 * 此函数用于向UiFilterTableView中关联的模型中追加一条数据。如果模型当前还没有任何数据（即行数为0），
 * 它还会更新搜索控件，用新的数据字段名列表来设置搜索条件可用的字段。
 * 
 * @param data 指向SSigInfo接口的智能指针，表示要追加的数据。SSigInfo接口应当由具体实现提供，以满足应用需求。
 */
void UiFilterTableView::appendData(QSharedPointer<IModel> data) {
    // 向模型中追加数据
    m_model->appendData(data);
}

void UiFilterTableView::appendData(QList<QSharedPointer<IModel> > sigs)
{
    for(auto& data : sigs) {
        appendData(data);
    }
}

void UiFilterTableView::clearData()
{
    m_model->removeAllData();
}

/**
 * @brief 该槽函数用于删除选中的信号数据。
 * 具体操作包括：首先从数据库中删除指定的数据，然后在用户界面中移除这些数据。
 * @param dataList 包含待删除数据的列表，每个数据项都为SSigInfo接口的智能指针。
 */

void UiFilterTableView::slotDeleteSig(const QList<QSharedPointer<IModel>>& dataList) {}

void UiFilterTableView::slotPasteSig()
{
    // 从剪贴板读取文本
    QString clipboardText = QApplication::clipboard()->text();

    // 尝试将文本解析为JSON
    QJsonParseError jsonError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(clipboardText.toUtf8(), &jsonError);

    // 检查解析是否成功
    if(jsonError.error != QJsonParseError::NoError || jsonDoc.isArray() == false)
    {
        // 如果解析失败或不是数组，则给出错误提示
        qDebug() << "Failed to parse JSON: " << jsonError.errorString();
        return;
    }

    // 解析成功，遍历JSON数组
    QJsonArray jsonArray = jsonDoc.array();
    for (const auto& jsonObj : jsonArray)
    {
        if (jsonObj.isObject())
        {
            QJsonObject obj = jsonObj.toObject();
            // 从Model中创建一个新的空数据
            QSharedPointer<IModel> newData;
            newData = m_model->getDataByIndex(0)->createEmpty();

            newData->fromJson(obj);
            newData->updateCopyName();//更新复制名称
        }
    }
}

void UiFilterTableView::slotAddSig()
{

}

void UiFilterTableView::applyFilter(const QString &field, const QString &text)
{
    m_searchWidget->applyFilter(field,text);
}
